﻿
import numpy as np


print("Numpy版本号：",np.__version__)

#一维数组
arr=np.array([1,2,3])
print("一维数组:",arr)

#多维度数组
arr2=np.array([[1,2,3],[4,5,6]])
print("多维度数组:",arr2)

# 最小维度  
miniArr = np.array([1, 2, 3, 4, 5], ndmin =  2)  
print ("最小维度:",miniArr)

print("数组的维度：",arr2.shape)
#调整数组的大小
arr2.shape=(3,2)
print("调整数组后的维度：",arr2.shape)
print("调整数组后的数据：",arr2)
print("每一个元素的大小：",arr2.itemsize)
print("内存信息：",arr2.flags)


# 默认为浮点数
x = np.zeros(5) 
print(x)
 
# 设置类型为整数
y = np.zeros((5,), dtype = int) 
print(y)
 
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print(z)

#根据范围形成数组
x = np.arange(10,20,2)  #起始值、终止值及步长
print ("根据范围生成的数组：",x)

#等差数列
a = np.linspace(1,10,10) #起始点为 1 ，终止点为 10，数列个数为 10
print("等差数列：",a)

#等比数列
a = np.logspace(1.0,  2.0, num =  10)  ## 默认底数是 10
print ("等比数列:",a)
#将对数的底数设置为 2 
a = np.logspace(0,9,10,base=2)
print (a)


#切片和索引
a = np.arange(10)
s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止，间隔为2
print (a[s])

# 冒号 : 的解释：如果只放置一个参数，如 [2]，将返回与该索引相对应的单个元素。
# 如果为 [2:]，表示从该索引开始以后的所有项都将被提取。如果使用了两个参数，
# 如 [2:7]，那么则提取两个索引(不包括停止索引)之间的项。
a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
b = a[5] 
print(b)

print(a[2:])
print(a[2:5])
print(a[1:])

a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素
print (a[...,1:])  # 第2列及剩下的所有元素


# 整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
# 以下实例获取数组中 (0,0)，(1,1) 和 (2,0) 位置处的元素。
x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
y = x[[0,1,2],  [0,1,0]]  
print (y)


x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是：' )
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  ('这个数组的四个角元素是：')
print (y)


a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)


x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是：')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素  
print  ('大于 5 的元素是：')
print (x[x >  5])



x=np.arange(32).reshape((8,4))
print(x)
# 二维数组读取指定下标对应的行
print("-------读取下标对应的行-------")
print (x[[4,2,1,7]])

#笛卡尔乘积
x=np.arange(32).reshape((8,4))
print ("笛卡尔乘积:",x[np.ix_([1,5,7,2],[0,3,1,2])])

#当运算中的 2 个数组的形状不同时，numpy 将自动触发广播机制
a = np.array([[ 0, 0, 0],
              [10,10,10],
              [20,20,20],
              [30,30,30]])
b = np.array([0,1,2])
print(a + b)


#4x3 的二维数组与长为 3 的一维数组相加，等效于把数组 b 在二维上重复 4 次再运算
a = np.array([[ 0, 0, 0],
              [10,10,10],
              [20,20,20],
              [30,30,30]])
b = np.array([1,2,3])
bb = np.tile(b, (4, 1))  # 重复 b 的各个维度
print(a + bb)



